Liquidable DAO:让 Nervos DAO 中的 CKB 重获流动性
Nervos DAO 是 CKB 上第一个链上 dApp,它可以有效消除二级发行所带来的增发影响。然而,存入 Nervos DAO 中的 CKB 至少要在 180 Epoch(约 30 天)之后,才能被取出并再次获得流动性。
开发者们一直在尝试打破 Nervos DAO 的流动性限制,之前 CKB 开发者 JJY 提出了 dCKB 的概念;这一次,开发者 Retric 创建了 Demo「Liquidable DAO」,进一步地对释放 Nervos DAO 的流动性做了尝试,并通过视频,和大家讲解了在 CKB 上开发的整体流程,和过程中可以使用的开发工具。👇👇👇
在本文中,Williams 将带着大家一起探究 Liquidable DAO 的奥秘。
DAO 中的 CKB 也可以重获流动性?
上图是 Demo 中的 Liquidable DAO dApp 界面。从中我们可以看到,在这个示范 dApp 中,主要可以分成四个功能,除了我们熟知的 Deposit、Withdraw 外(Nervos DAO 的存入和取出功能),我们还可以看到有两个特殊的选项,那就是 Deposit With Special Lock 和 Transfer DAO Cell。简单地说,我们可以将 CKB 透过 「Deposit With Special Lock 」,生成一个所有权能够转移的 Nervos DAO Cell,并且透过 Transfer DAO Cell,让我们的 Nervos DAO Cell 能在 180 Epoch 期满后,可以被其他拥有所有权的人开启使用。
如此一来,Nervos DAO 中的 CKB 就变成了一个可继续流动的资产,可以去用于借贷、抵押、收益聚合器等各种 DeFi 相关的合约或者协议中。在未来依旧可以让新的 Nervos DAO Cell 的所有者(如接收方、清算方)在到期日后兑换出其中的 CKB 使用。如此一来,不但能够让锁仓的状态持续,也不会让 Nervos DAO 中 CKB 的抵押者缺乏资产流动性。
Liquidable DAO 的原理和设计
接下来我们来探讨具体的设计。首先,如果我们要让 Nervos DAO 中的 CKbyte 具有流动性,那么就代表这个 Nervos DAO Cell 不但是可以交易的,同时它的新拥有者能够顺利地使用 Nervos DAO Cell。在 180 个 Epoch 期满后,可以用于兑换存在 Nervos DAO 中的 Cell,并且一并将二级发行奖励中的 CKB 一起拿走。
如果要让我们 Nervos DAO 中的 CKB 可以让别人领取、使用,那么在原先的 Nervos DAO Cell 中势必要做些改变,但是要如何在保持 Nervos DAO 的特性下,还可以对所有权进行移转呢?
我们知道 Nervos DAO 的脚本设置在 Cell 的 type script 中,因此我们确定了 type script 是不能修改的。这时候我们只能在另外一个 lock script 上做一些文章。我们只要能够将系统默认的 secp256k1,变成一个特殊的 Special lock 即可。
合约编写流程
在这样的设计下,我们就能够确保 Nervos DAO Cell 的所有权会随着 Puppet Cell 的转移而成功移转。而 Puppet Cell 也可以成为一个基于 Nervos DAO 的衍生资产,因为任何收到 Puppet Cell 的人都会知道,其背后支撑的是正在 Nervos DAO 中存放的 CKB。
把当前 Lock 的 args 都加载进来 把所有的 input cell 全部循环一遍,看看里面是不是存在一个 input cell,他的 type script hash 跟这个 args 是相等的,因此我们会把 args 露出,去寻找有没有存在对应关系的 input 如果没有找到对应的 input cell 或者找到的数量大于 1,那么返回错误,因为我们需要确定 Puppet Cell 和 Nervos DAO Cell 是一对一的绑定关系 如果只有一个 Cell 满足这个条件,则把这个 puppet cell 的 data 字段加载出来,作为目标用户的 public key hash 从这笔交易的签名中恢复出一个用于签名的公钥哈希,这样就有两把公钥 一是目标用户存在 puppet cell 里面的 data 字段的公钥 这笔交易签名用的公钥 检查两把公钥是否相等,若相等,则证明签名的和 cell 的拥有者是同一人,返回正确。
可以使用的基础工具
在合约编写部分,Capsule 可以做为链上合约编写的开发工具,测试和部署等工作也可以直接在 Capsule 中完成,可以节省许多工作量,让开发者可以专注在自己的业务逻辑的编写和设计。在这个过程比较有趣的地方是在恢复公钥的部分,里面还会涉及到一个「动态加载(Dynamic Loading)」技术,把签名所需要用到的算法加载进来。
1. Liquidable DAO dApp repo:
https://github.com/RetricSu/liquidable-dao-dapp
2. Liquidable DAO 合约 repo:
https://github.com/RetricSu/liquidable-nervos-dao-contract
3. dApp server 开发工具 Lumos:
https://github.com/nervosnetwork/lumos
4. dApp 合约编写开发工具 Capsule:
https://github.com/nervosnetwork/capsule
5. Type ID:
https://xuejie.space/2020_02_03_introduction_to_ckb_script_programming_type_id/
6. Dynamic Load:
https://docs.nervos.org/docs/labs/capsule-dynamic-loading-tutorial